import TaskLog from "./common/TaskLog";
import { eventBus } from "../eventBus";
import moment from "moment";

/**
 * 全局共享队列 , 基于promise非阻塞
 * 特点：
 *      1.支持异步插入
 *      2.支持自执行
 *      3.支持调用日志
 *      4.支持失败后，再次执行
 */
export class GlobalTaskQueue {
  constructor() {
    this.init();
    this.EventBusKey = "GlobalTaskQueue";
  }
  // 初始化
  init() {
    this.ErrorTask = []; // 错误执行队列
    this.RunStatus = false; // 当前队列执行状态
    this.TaskList = []; // 待执行任务队列   使用 Proxy 去代理 任务队列 ，任务队列的长度发生变化时
    this.currentTask = null; // 当前执行的任务
    this.TaskRunLog = new TaskLog(); // 当前任务执行日志
    this.runCount = 0; //  当次 执行任务个数
  }
  // 新增任务
  addTask(task) {
    if (Array.isArray(task)) {
      task.forEach((taskItem) => this.addTaskItem(taskItem));
    } else {
      this.addTaskItem(task);
    }
    // 触发执行
    this.runQueue();
  }
  // 单个新增任务
  addTaskItem(task) {
    this.TaskList.push(task);
    // 更新日志
    this.TaskRunLog.updateLog({
      taskId: task.taskId,
      addTime: moment().format("yyyy-MM-DD HH:mm:ss"),
      data: task,
    });
  }
  // 再次执行 日志
  reRunErrorTask(ErrorTask) {
    console.log("ErrorTask", ErrorTask);
    // 如果 设置了 errorReRun 则 失败后再执行一次
    if (ErrorTask.errorReRun) {
      ErrorTask.errorReRun = false;
      // this.addTaskItem(ErrorTask)
      this.TaskList.push(ErrorTask); //  日志只会更新最新的返回结果
    }
  }
  // 更新日志
  upDateTaskLog(task, status, response) {
    this.TaskRunLog.updateLog({
      taskId: task.taskId,
      runEndTime: moment().format("yyyy-MM-DD HH:mm:ss"),
      status: status,
      response: response,
    });
    if (status == "失败") {
      this.ErrorTask.push(task);
    }
  }
  // 展示日志快照
  showTaskLog() {
    const obj = {
      成功: this.TaskRunLog.showSeccessLogList(),
      失败: this.TaskRunLog.showErrorLogList(),
      未执行: this.TaskRunLog.showNoRunLogList(),
      异常_非三种状态: this.TaskRunLog.showErrorData(),
      所有: this.TaskRunLog.logList,
      说明: "该快照是  JSON.parse 拷贝，无法复制未执行函数",
    };
    // this.TaskRunLog.clearLogList(); // 清空当次日志
    return JSON.parse(JSON.stringify(obj));
  }
  // eventBus 分发结果数据
  setEventBus(currentTaskLog) {
    eventBus.$emit(this.EventBusKey, currentTaskLog["所有"]);
  }
  // 执行任务队列
  runQueue() {
    if (this.RunStatus) return console.log("正在执行中，请勿持续触发"); //当前任务执行时，自动关闭
    const results = [];
    this.RunStatus = true;
    const executeTask = () => {
      if (this.TaskList.length === 0) {
        this.RunStatus = false; // 改变队列执行状态
        this.currentTask = null;
        console.log("当前队列执行完成,共完成次数:", this.runCount);

        const currentTaskLog = this.showTaskLog();
        this.setEventBus(currentTaskLog);
        console.log("当前日志执行", currentTaskLog);
        this.runCount = 0;
        return Promise.resolve(results);
      }
      //   console.log("当前队个数", this.TaskList.length);
      const task = this.TaskList[0];
      this.currentTask = task;
      console.log("当前执行任务", this.currentTask);
      return Promise.resolve(task.task())
        .then((result) => {
          results.push(result);
          this.runCount++; // 更新当次 执行次数
          this.upDateTaskLog(task, "成功", result); // 更新日志
          this.currentTask = null; // 清空当前任务
          this.TaskList.shift(); //  移除队列已执行任务
          return executeTask();
        })
        .catch((error) => {
          this.upDateTaskLog(task, "失败", error); // 更新日志
          this.runCount++; // 更新当次 执行次数
          this.currentTask = null; // 清空当前任务
          this.TaskList.shift(); //  移除队列已执行任务
          this.reRunErrorTask(task); // 失败任务是否 再次执行
          return executeTask();
        });
    };
    return executeTask();
  }
}
